package com.kingviker.example.nio;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;

/**
 * scattering  gathering
 */
public class NioTest11 {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        InetSocketAddress address = new InetSocketAddress(8899);
        serverSocketChannel.bind(address);

        int messageLength =2+3+4;
        ByteBuffer[] buffers = new ByteBuffer[3];
        buffers[0] = ByteBuffer.allocate(2);
        buffers[1] = ByteBuffer.allocate(3);
        buffers[2] = ByteBuffer.allocate(4);
        SocketChannel socketChannel = serverSocketChannel.accept();
        while ((true)){
            int bytesRead=0;
            while ((bytesRead<messageLength)){
                    long r = socketChannel.read(buffers);
                    bytesRead+=r;
                System.out.println("bytesRead:"+bytesRead);
                Arrays.asList(buffers).stream().map(buffer->("position:"+buffer.position()+",limit:"+buffer.limit()))
                .forEach(System.out::println);
            }


            Arrays.asList(buffers).forEach(byteBuffer -> {byteBuffer.flip();});

            long bytesWritten = 0;
            while (bytesWritten<messageLength){
                long w = socketChannel.write(buffers);
                bytesWritten+=w;
            }

            Arrays.asList(buffers).forEach(byteBuffer -> {byteBuffer.clear();});

            System.out.println("bytesRead:"+bytesRead+",bytesWritten:"+bytesWritten+",messageLength:"+messageLength);
        }



    }
}
